//******************************************************//
//														//
//					LineaAbono.java						//
//														//
//******************************************************//


package Misc;

import java.util.ArrayList;

import Actores.Cliente;

public class LineaAbono extends Linea {
    private Integer minutosTotales,
            minutosConsumidos,
            mensajesTotales,
            mensajesConsumidos;
    private Float precioMensual,
            valorMinutosExcedentes,
            valorMensajesExcedentes;
    private ArrayList <Servicio> listaServicios;

    // Constructor ===================================
    
    public LineaAbono(Integer id, Cliente cli, Integer n,
            Float pM, Integer minT, Integer menT, Float vMiEx, Float vMeEx) {
        super(id, cli, n);

        precioMensual = pM;
        minutosTotales = minT;
        minutosConsumidos = 0;
        mensajesTotales = menT;
        mensajesConsumidos = 0;
        valorMinutosExcedentes = vMiEx;
        valorMensajesExcedentes = vMeEx;
        listaServicios = new ArrayList<Servicio>();
    }

    // Setters ========================================    
    
    // Getters ========================================

    @Override
    public Float getPrecio() {
        return precioMensual;
    }

    @Override
    public Integer getMinutosConsumidos() {
        return minutosConsumidos;
    }

    @Override
    public Integer getMensajes() {
        return mensajesTotales;
    }

    @Override
    public Integer getMinutos() {
        return minutosTotales;
    }

    @Override
    public Float getValorMinExc() {
        return valorMinutosExcedentes;
    }

    @Override
    public Float getValorMenExc() {
        return valorMensajesExcedentes;
    }

    @Override
    public Float getCostoMinExc() {
        return (minutosTotales < minutosConsumidos) ?
            ((minutosConsumidos - minutosTotales) * valorMinutosExcedentes)
            : 0.0f;
    }    

    @Override
    public Float getCostoMenExc() {
        return (minutosTotales < minutosConsumidos) ?
            ((mensajesConsumidos - mensajesTotales) * valorMinutosExcedentes)
            : 0.0f;
    }

    @Override
    public Integer getMensajesConsumidos() {
        return mensajesConsumidos;
    }
    
    public Integer getMinutosDisponibles() {
    	return minutosTotales - minutosConsumidos;
    }
    
    public Integer getMensajesDisponibles() {
    	return mensajesTotales - mensajesConsumidos;
    }
    
    public Integer getMinutosExcedidos() {
    	if (getMinutosDisponibles() >= 0)
    		return 0;
    	else return  (minutosConsumidos - minutosTotales);
    }
    
    public Integer getMensajesExcedidos() {
    	if (getMensajesDisponibles() >= 0)
    		return 0;
    	else return  (mensajesConsumidos - mensajesTotales);
    }
    
    
    
    // Otras funciones ================================     
    

    @Override
    public boolean eliminarServicio(Servicio s) {
        return listaServicios.remove(s); //Si s no esta en la lista devuelve false
    }
    
    public boolean tieneServicioID(Integer id) {
        int i = 0;
        while ((i < listaServicios.size()) && !(listaServicios.get(i).sos(id))) 
        	++i;        
        if(i < listaServicios.size())
        	return true;
        else return false;    
    }
    
    public void agregarServicio(Servicio s) {        
        if(this.tieneServicioID(s.getID())) //Si es cierto ya existe        		
        	System.out.println("Error - El servicio ya existe.");
        else	
        	if(listaServicios.add(s))       	
        		System.out.println("Servicio agregado correctamente.");
        	else
        		System.out.println("Error al agregar el servicio.");
    }    

    @Override
    public boolean sosAbono() {
        return true;
    }

    @Override
    public void mostrarServicios() {        
        if (listaServicios.isEmpty())
        	System.out.println("\nLa linea no contiene servicios contratados.");
        else {   
        	System.out.println("\nLos servicios contratados son los siguientes:");        	
        	for (Servicio s : listaServicios) {
        		System.out.println("\nID: " + s.getID() +
        				"\nDescripcion: " + s.getDescripcion() +
        				"\nPrecio: $" + s.getCosto());
        }        
    }
    }
    
    public String toString() {
        return super.toString() +
                "\nTipo: Abono" + 
                "\nPrecio Mensual: " + precioMensual;
    }
    
    public void mostrarSaldo() {
    	System.out.println("\nSALDO:\n");    			
    			
    	if (getMinutosDisponibles()>=0)
    		System.out.println("\nMinutos disponibles: " + getMinutosDisponibles());
    	else {   		
    		System.out.println("\nMinutos excedidos: " + (-getMinutosDisponibles()));
    		System.out.println("\nImporte excedido (minutos): $" + getCostoMinExc());
    	}
    	if (getMensajesDisponibles()>=0)
    		System.out.println("\nMensajes disponibles: " + getMensajesDisponibles());
    	else {  		
    		System.out.println("\nMensajesexcedidos: " + (-getMensajesDisponibles())); 
    		System.out.println("\nImporte excedido (mensajes): $" + getCostoMenExc());
	}
    }
    
    public void consumirMensajes(int cant){
    	mensajesConsumidos+=cant;
    	
    	if (!(this.getMensajesDisponibles() > cant ))   	    		    		
    		System.out.println("Se ha utilizado credito adicional.");    	   		
    }
    
    public void consumirMinutos(int cant){
    	minutosConsumidos+=cant;
    	
    	if (!(this.getMinutosDisponibles() > cant ))
    		System.out.println("Se ha utilizado credito adicional."); 
    }
    
    public void cargarTarjeta(Tarjeta t) {
    	System.out.println("Error no se puede aplicar la tarjeta a lineas de abono.");
    }
    
    public Float calcularImporteServicios(){
    	Float i = 0.0f;
    	for (Servicio s : listaServicios)
    		i += s.getCosto();    	
    	return i;
    }    
    
}